package lintulaskenta.entity;



import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

/*
 * Reitti on se matka jolla yksi laskenta tehdään, reitillä on monta pistettä,
 * joilla havaintoja tehdään
 */

@Entity
public class Reitti implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long reitinNumero;
    @Column
    private long vanhaReittiNumero;
    @Column
    private long talvireitinNumero;
//    @Column
//    private double peninkulmaruutu;  ei käytössä
    @Column
    private String reitinAlias;
    @Column
    private int pisteidenLkm;
    @Column
    private int pohjoiskoordinaatti;
    @Column
    private int itakoordinaatti;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "reitti", orphanRemoval=true)
    private List<Havainnointitapahtuma> havainnointitapahtumat = new ArrayList<Havainnointitapahtuma>();
    @ManyToMany(cascade = CascadeType.MERGE)
    @JoinTable(name = "reittipiste_table",
    joinColumns = {
        @JoinColumn(name = "reitinNumero")},
    inverseJoinColumns = {
        @JoinColumn(name = "havaintopisteId")})
    private List<Havaintopiste> havaintopisteet = new ArrayList<Havaintopiste>();

    public Reitti() {
    }

    public Reitti(long vanhaReittiNumero, long talvireitinNumero, double peninkulmaruutu, int pisteidenLkm, int pohjoiskoordinaatti, int itakoordinaatti) {
        this.vanhaReittiNumero = vanhaReittiNumero;
        this.talvireitinNumero = talvireitinNumero;
//        this.peninkulmaruutu = peninkulmaruutu;
        this.pisteidenLkm = pisteidenLkm;
        this.pohjoiskoordinaatti = pohjoiskoordinaatti;
        this.itakoordinaatti = itakoordinaatti;
    }

    public long getVanhaReittiNumero() {
        return vanhaReittiNumero;
    }

    public void setVanhaReittiNumero(long vanhaReittiNumero) {
        this.vanhaReittiNumero = vanhaReittiNumero;
    }

    public List<Havainnointitapahtuma> getHavainnointitapahtumat() {
        return havainnointitapahtumat;
    }

    public void addHavainnointitapahtuma(Havainnointitapahtuma h) {
        h.setReitti(this);
        if (!havainnointitapahtumat.contains(h)) {
            havainnointitapahtumat.add(h);
        }

    }
    
    public List<Havaintopiste> getHavaintopisteet() {
        return havaintopisteet;
    } 

    public void addHavaintopiste(Havaintopiste h) {
        if (h != null) {
            if (!havaintopisteet.contains(h)) {
                havaintopisteet.add(h);
            }
            if(!h.getReitit().contains(this)) {
                h.getReitit().add(this);
            }
        }
    }

    public String getReitinAlias() {
        return reitinAlias;
    }

    public void setReitinAlias(String reitinAlias) {
        this.reitinAlias = reitinAlias;
    }

    public int getItakoordinaatti() {
        return itakoordinaatti;
    }

    public void setItakoordinaatti(int itakoordinaatti) {
        this.itakoordinaatti = itakoordinaatti;
    }

//    public double getPeninkulmaruutu() {
//        return peninkulmaruutu;
//    }
//
//    public void setPeninkulmaruutu(double peninkulmaruutu) {
//        this.peninkulmaruutu = peninkulmaruutu;
//    }

    public int getPisteidenLkm() {
        return pisteidenLkm;
    }

    public void setPisteidenLkm(int pisteidenLkm) {
        this.pisteidenLkm = pisteidenLkm;
    }

    public int getPohjoiskoordinaatti() {
        return pohjoiskoordinaatti;
    }

    public void setPohjoiskoordinaatti(int pohjoiskoordinaatti) {
        this.pohjoiskoordinaatti = pohjoiskoordinaatti;
    }

    public long getReitinNumero() {
        return reitinNumero;
    }

    public long getTalvireitinNumero() {
        return talvireitinNumero;
    }

    public void setTalvireitinNumero(long talvireitinNumero) {
        this.talvireitinNumero = talvireitinNumero;
    }
}